import request from './config'
import { showToast } from 'vant'

// 用户类型定义
export interface User {
  id: string | number;
  username: string;
  userAccount?: string;
  phone?: string;
  nickname?: string;
  avatar?: string;
  role?: string;
  token?: string;
  createTime?: string;
  updateTime?: string;
}

// 登录请求参数
export interface LoginParams {
  userAccount: string;
  password: string;
}

// 保存用户信息到本地存储
export const saveUserInfo = (userInfo: User) => {
  localStorage.setItem('userInfo', JSON.stringify(userInfo))
  localStorage.setItem('token', userInfo.token || '')
}

// 从本地存储获取用户信息
export const getUserInfo = (): User | null => {
  const userInfo = localStorage.getItem('userInfo')
  return userInfo ? JSON.parse(userInfo) : null
}

// 从本地存储获取token
export const getToken = (): string => {
  return localStorage.getItem('token') || ''
}

// 清除用户信息
export const clearUserInfo = () => {
  localStorage.removeItem('userInfo')
  localStorage.removeItem('token')
}

// 检查是否已登录
export const isLoggedIn = (): boolean => {
  return !!getToken()
}

/**
 * 用户登录
 * @param params 登录参数
 */
export const login = async (params: LoginParams): Promise<User | null> => {
  try {
    console.log('发送登录请求:', params.userAccount)
    const { data } = await request({
      url: '/sysUser/login',
      method: 'POST',
      data: {
        userAccount: params.userAccount,
        userPassword: params.password
      }
    })
    
    console.log('登录响应数据:', data)
    
    if (data.code === 200 && data.data) {
      // 处理返回的用户信息
      const userData: User = {
        id: data.data.id,
        username: data.data.username,
        userAccount: data.data.userAccount,
        phone: data.data.phone,
        token: data.data.token || data.token // 有些接口可能在data下或直接在data.data下返回token
      }
      
      console.log('用户信息处理完成:', userData)
      
      // 确保token存在
      if (!userData.token) {
        console.warn('警告: 登录响应中没有找到token')
        // 如果没有token，可能需要从其他地方获取，或者返回一个错误
        userData.token = data.token || ''; // 尝试从响应根级别获取token
        
        // 如果仍然没有token，可以使用一个临时token进行测试
        if (!userData.token) {
          console.warn('使用临时token进行测试')
          userData.token = 'temp_token_for_testing'
        }
      }
      
      // 直接设置token，确保用户信息保存前token已存在
      localStorage.setItem('token', userData.token)
      console.log('Token直接保存完成:', userData.token)
      
      // 保存用户信息
      localStorage.setItem('userInfo', JSON.stringify(userData))
      console.log('用户信息已保存, 验证Token:', getToken())
      
      return userData
    }
    
    console.warn('登录响应错误:', data.message || '未知错误')
    showToast({
      type: 'fail',
      message: data.message || '登录失败',
      position: 'bottom'
    })
    return null
  } catch (error) {
    console.error('登录请求异常:', error)
    showToast({
      type: 'fail',
      message: '登录失败，请检查网络连接',
      position: 'bottom'
    })
    return null
  }
}

/**
 * 退出登录
 */
export const logout = async (): Promise<boolean> => {
  try {
    const { data } = await request({
      url: '/sysUser/logout',
      method: 'POST'
    })
    
    // 无论后端结果如何，前端都清除用户信息
    clearUserInfo()
    
    if (data.code === 200) {
      showToast({
        type: 'success',
        message: '退出成功',
        position: 'bottom'
      })
      return true
    }
    
    return false
  } catch (error) {
    console.error('退出登录失败:', error)
    // 即使请求失败，也要清除本地用户信息
    clearUserInfo()
    return false
  }
}

/**
 * 根据ID获取用户信息
 * @param id 用户ID
 */
export const getUserById = async (id: string | number): Promise<User | null> => {
  try {
    const { data } = await request({
      url: '/sysUser/getById',
      method: 'POST',
      params: { id }
    })
    
    if (data.code === 200 && data.data) {
      return {
        id: data.data.id,
        username: data.data.username,
        userAccount: data.data.userAccount,
        phone: data.data.phone,
        createTime: data.data.createTime,
        updateTime: data.data.updateTime
      }
    }
    
    return null
  } catch (error) {
    console.error('获取用户信息失败:', error)
    return null
  }
} 